package inputOutput;



import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;


import reservation.Reservation;


import config.Config;
import ecole.infrastructure.Batiment;
import ecole.organisation.Ecole;
/**
 * Cette classe permet de réaliser une réalisation de différent objet 
 * @author FAUCONNIER Simon
 *
 */

public class SerialisationXml extends Serialisation {

    
    //private static Element racine;
   // private static org.jdom2.Document document;
    private String pathEcoXml = Config.PATH_ECO_XML;
    private String pathResXml= Config.PATH_RES_XML;
    private String pathBatXml = Config.PATH_BAT_XML;
    public SerialisationXml() {
        super();
        //racine = new Element("Liste");
        //  document = new Document(racine);
  }
    
    /**
     * Serialisation d'un objet dans un fichier
     * @param object objet a serialiser
     * @param filename chemin du fichier
     * @throws FileNotFoundException 
     */
    public void sauvegarder(Batiment batiment) throws FileNotFoundException  {
        System.out.println("Sauvegarde xml Ecole");
        // ouverture de l'encodeur vers le fichier
        XMLEncoder encoder = new XMLEncoder(new FileOutputStream(pathBatXml));
        try {
            // serialisation de l'objet
            encoder.writeObject(batiment);
            encoder.flush();
        } finally {
            // fermeture de l'encodeur
            encoder.close();
           
        }
    }  
    
    /**
     * Serialisation d'un objet dans un fichier
     * @param object objet a serialiser
     * @throws FileNotFoundException 
     */
    public void sauvegarder(List<Reservation> reservation) throws FileNotFoundException  {
        System.out.println("Sauvegarde xml réservation");
        // ouverture de l'encodeur vers le fichier
        XMLEncoder encoder = new XMLEncoder(new FileOutputStream(pathResXml));
        try {
            // serialisation de l'objet
            encoder.writeObject(reservation);
            encoder.flush();
        } finally {
            // fermeture de l'encodeur
            encoder.close();
           
        }
    }  
    
    /**
     * Serialisation d'un objet dans un fichier
     * @param object objet a serialiser
     * @throws FileNotFoundException 
     */
    public void sauvegarder(Ecole ecole) throws FileNotFoundException  {
        System.out.println("Sauvegarde xml ecole");
        // ouverture de l'encodeur vers le fichier
        XMLEncoder encoder = new XMLEncoder(new FileOutputStream(pathResXml));
        try {
            // serialisation de l'objet
            encoder.writeObject(ecole);
            encoder.flush();
        } finally {
            // fermeture de l'encodeur
            encoder.close();
            
        }
    }  
    
    /**
     * Désérialisation de l'école dans présent dans le fichier XML
     * @throws IOException
     */
    public Batiment chargerBatiment()throws IOException{
                    
        // ouverture de decodeur
        XMLDecoder decoder = new XMLDecoder(new FileInputStream(pathBatXml));
        try {
            // deserialisation de l'objet
            batiment = (Batiment) decoder.readObject();
        } finally {
            // fermeture du decodeur
            decoder.close();
        }
        return batiment;
    }
    
    /**
     * Désérialisation de réservation dans présent dans le fichier XML
     * @throws IOException
     */
    public List<Reservation> chargerReservation()throws IOException{
        
        // ouverture de decodeur
        XMLDecoder decoder = new XMLDecoder(new FileInputStream(pathEcoXml));
        try {
            // deserialisation de l'objet
            reservation = (List<Reservation>) decoder.readObject();
        } finally {
            // fermeture du decodeur
            decoder.close();
        }
        return reservation;
    }
    
    /**
     * Désérialisation de l'école dans présent dans le fichier XML
     * @throws IOException
     */
    public Ecole chargerEcole()throws IOException{
        
        // ouverture de decodeur
        XMLDecoder decoder = new XMLDecoder(new FileInputStream(pathEcoXml));
        try {
            // deserialisation de l'objet
           ecole = (Ecole) decoder.readObject();
        } finally {
            // fermeture du decodeur
            decoder.close();
        }
        return ecole;
    }
 /*
    public void sauvegarder(Ecole ecole){
          Element elementProfesseur=new Element("Professeur");
          racine.addContent(elementProfesseur);
          
          for(int i=0;i<ecole.getNombreProfesseurEcole();i++){
              Professeur professeur=ecole.getProfesseur(i);
              Element PROFESSEUR = new Element(professeur.getNom());
              Attribute prenomProfesseur= new Attribute("Prenom",String.valueOf(ecole.getProfesseur(i).getPrenom()));
              Attribute sexeProfesseur = new Attribute("Sexe",String.valueOf(ecole.getProfesseur(i).getSexe()));
              Attribute identifiantProfesseur= new Attribute("Identifiant",String.valueOf(ecole.getProfesseur(i).getIdentifiant()));
              //Attribute adresseMailProfesseur = new Attribute("Adresse mail",String.valueOf(ecole.getProfesseur(i).getAdresseMail()));
              PROFESSEUR.setAttribute(prenomProfesseur);
              PROFESSEUR.setAttribute(sexeProfesseur);
              PROFESSEUR.setAttribute(identifiantProfesseur);
              //PROFESSEUR.setAttribute(adresseMailProfesseur);
              
              elementProfesseur.addContent(PROFESSEUR);
          }
    
          Element elementFormation=new Element("Formation");
          racine.addContent(elementFormation);
    
          for(int i=0;i<ecole.getNombreFormationEcole();i++){
              Formation formation1=ecole.getFormation(i);
              Element FORMATION = new Element(formation1.getNomFormation());
              Attribute anneeFormation = new Attribute("Annee",String.valueOf(ecole.getFormation(i).getAnneeFormation()));
              Attribute responsableFormation = new Attribute("Responsable",String.valueOf(ecole.getFormation(i).getResponsableFormation()));
              FORMATION.setAttribute(anneeFormation);
              FORMATION.setAttribute(responsableFormation);
              elementFormation.addContent(FORMATION);
          }
    
          Element elementEtudiant=new Element("Etudiant");
          racine.addContent(elementEtudiant);
          
          for(int i=0;i<ecole.getNombreEtudiantEcole();i++){
              Etudiant etudiant=ecole.getEtudiant(i);
              Element ETUDIANT = new Element(etudiant.getNom());
              Attribute prenomEtudiant= new Attribute("Prénom",String.valueOf(ecole.getEtudiant(i).getPrenom()));
              Attribute sexeEtudiant = new Attribute("Sexe",String.valueOf(ecole.getEtudiant(i).getSexe()));
              Attribute identifiantEtudiant= new Attribute("Identifiant",String.valueOf(ecole.getEtudiant(i).getIdentifiant()));
              // Attribute adresseMailEtudiant = new Attribute("Adresse mail",String.valueOf(ecole.getEtudiant(i).getAdresseMail()));
              // Attribute formationEtudiant= new Attribute("Formation",String.valueOf(ecole.getEtudiant(i).getFormation().getFormation()));
              // Attribute groupeEtudiant = new Attribute("Groupe",String.valueOf(ecole.getEtudiant(i).getNomGroupe()));
              ETUDIANT.setAttribute(prenomEtudiant);
              ETUDIANT.setAttribute(sexeEtudiant);
              ETUDIANT.setAttribute(identifiantEtudiant);
              //ETUDIANT.setAttribute(adresseMailEtudiant);
              //ETUDIANT.setAttribute(formationEtudiant);
              //ETUDIANT.setAttribute(groupeEtudiant);
              elementEtudiant.addContent(ETUDIANT);           
          }
          
          Element elementEnseignement=new Element("Enseignement");
          racine.addContent(elementEnseignement);
          for(int i=0; i<ecole.getNombreFormationEcole();i++){
              for(int j=0; j<ecole.getFormation(i).getNombreEnseignement();j++){
                  Element ENSEIGNEMENT = new Element(ecole.getFormation(i).getEnseignement(j).getNomEnseignement());
                  Attribute formationEnseignement = new Attribute("Formation",String.valueOf(ecole.getFormation(i).getNomFormation()+ ecole.getFormation(i).getAnneeFormation()));
                  Attribute professeurEnseignement = new Attribute("Responsable",String.valueOf(ecole.getFormation(i).getEnseignement(j).getRespEnseignement()));
                  Attribute coefficientEnseignement = new Attribute("Coefficient",String.valueOf(ecole.getFormation(i).getEnseignement(j).getCoef()));
                  Attribute descriptifEnseignement = new Attribute("Descriptif",String.valueOf(ecole.getFormation(i).getEnseignement(j).getDescriptif()));
                  ENSEIGNEMENT.setAttribute(formationEnseignement);
                  ENSEIGNEMENT.setAttribute(professeurEnseignement);
                  ENSEIGNEMENT.setAttribute(coefficientEnseignement);
                  ENSEIGNEMENT.setAttribute(descriptifEnseignement);
                  elementEnseignement.addContent(ENSEIGNEMENT);
              }       
         }
          
           
          Element elementGroupe=new Element("Groupe");
          racine.addContent(elementGroupe);
          for(int i=0; i<ecole.getNombreFormationEcole();i++){
              for(int j=0;j<ecole.getFormation(i).getNbGroupe();j++){
                  Element GROUPE=new Element(ecole.getFormation(i).getGroupe(j).getNomGroupe());
                  Attribute nbrEtudiants=new Attribute("étudiants",String.valueOf(ecole.getFormation(i).getGroupe(j).getCapacite()));
                  GROUPE.setAttribute(nbrEtudiants);
    
                  Element FORMATION=new Element("formation");
                  GROUPE.addContent(FORMATION);
                  Attribute laFormation = new Attribute("formation",String.valueOf(ecole.getFormation(i).getNomFormation()));
                  GROUPE.setAttribute(laFormation);
                  elementGroupe.addContent(GROUPE);
              }
          }
    
          enregistre(pathEcXml);
        
     }
    
    
    
    public void charger(){
        try {
            lireFichier();
            
            
            //à compléter
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
        
    
    static void enregistre(String fichier){
    try
        {
            //On utilise ici un affichage classique avec getPrettyFormat()
            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
            //Remarquez qu'il suffit simplement de créer une instance de FileOutputStream
            //avec en argument le nom du fichier pour effectuer la sérialisation.
            sortie.output(document, new FileOutputStream(fichier));
        }
     catch (java.io.IOException e){}
  }

    
    private void lireFichier() throws Exception {
        SAXBuilder sxb = new SAXBuilder();
        document = sxb.build(new File(pathEcXml));
        racine = document.getRootElement();
    }
*/


}



